import pagesObj from '@/pages.json';
import { isMpWeixin } from './platform.js';

const { pages, subPackages, tabBar } = pagesObj;

/** 判断当前页面是否是 tabbar 页  */
export const getIsTabbar = () => {
  if (!tabBar) {
    return false;
  }
  if (!tabBar.list.length) {
    // 通常有 tabBar 的话，list 不能有空，且至少有2个元素，这里其实不用处理
    return false;
  }
  const lastPage = getLastPage();
  const currPath = lastPage.route;
  return !!tabBar.list.find(e => e.pagePath === currPath);
};

// 获取当前页面栈的实例，最后一个就是当前页面
export const getLastPage = () => {
  const pages = getCurrentPages();
  return pages[pages.length - 1];
};

/**
 * 获取当前页面路由的 path 路径和 redirectPath 路径
 * path 如 '/pages/login/index'
 * redirectPath 如 '/pages/demo/base/route-interceptor'
 */
export const currRoute = () => {
  const lastPage = getLastPage();
  const currRoute = lastPage.$page;
  // console.log('lastPage.$page:', currRoute)
  // console.log('lastPage.$page.fullpath:', currRoute.fullPath)
  // console.log('lastPage.$page.options:', currRoute.options)
  // console.log('lastPage.options:', (lastPage as any).options)
  // 经过多端测试，只有 fullPath 靠谱，其他都不靠谱
  const { fullPath } = currRoute;
  // console.log(fullPath)
  // eg: /pages/login/index?redirect=%2Fpages%2Fdemo%2Fbase%2Froute-interceptor (小程序)
  // eg: /pages/login/index?redirect=%2Fpages%2Froute-interceptor%2Findex%3Fname%3Dfeige%26age%3D30(h5)
  return getUrlObj(fullPath);
};

const ensureDecodeURIComponent = url => {
  if (url.startsWith('%')) {
    return ensureDecodeURIComponent(decodeURIComponent(url));
  }
  return url;
};

/**
 * 解析 url 得到 path 和 query
 * 比如输入url: /pages/login/index?redirect=%2Fpages%2Fdemo%2Fbase%2Froute-interceptor
 * 输出: {path: /pages/login/index, query: {redirect: /pages/demo/base/route-interceptor}}
 */
export const getUrlObj = url => {
  const [path, queryStr] = url.split('?');
  // console.log(path, queryStr)

  if (!queryStr) {
    return {
      path,
      query: {}
    };
  }
  const query = {};
  queryStr.split('&').forEach(item => {
    const [key, value] = item.split('=');
    query[key] = ensureDecodeURIComponent(value); // 这里需要统一 decodeURIComponent 一下，可以兼容h5和微信y
  });
  return { path, query };
};

// 获取所有的页面，包括主包和分包
export const getAllPages = (key = 'needLogin') => {
  // 这里处理主包
  const mainPages = [
    ...pages
      .filter(page => !key || page[key])
      .map(page => ({
        ...page,
        path: `/${page.path}`
      }))
  ];
  // 这里处理分包
  const subPages = [];
  subPackages.forEach(subPageObj => {
    // console.log(subPageObj)
    const { root } = subPageObj;

    subPageObj.pages
      .filter(page => !key || page[key])
      .forEach(page => {
        subPages.push({
          ...page,
          path: `/${root}/${page.path}`
        });
      });
  });
  const result = [...mainPages, ...subPages];
  return result;
};

/**
 * 得到所有的需要登录的 pages，包括主包和分包的
 * 只得到 path 数组
 */
export const getNeedLoginPages = () => getAllPages('needLogin').map(page => page.path);

/**
 * 得到所有的需要登录的 pages，包括主包和分包的
 * 只得到 path 数组
 */
export const needLoginPages = getNeedLoginPages();

/**
 * 根据微信小程序当前环境，判断应该获取的 baseUrl
 */
export const getEnvBaseUrl = () => {
  // 请求基准地址
  let baseUrl = import.meta.env.VITE_SERVER_BASEURL;

  // 微信小程序端环境区分
  if (isMpWeixin) {
    const {
      miniProgram: { envVersion }
    } = uni.getAccountInfoSync();

    switch (envVersion) {
      case 'develop':
        baseUrl = import.meta.env.VITE_SERVER_BASEURL__WEIXIN_DEVELOP || baseUrl;
        break;
      case 'trial':
        baseUrl = import.meta.env.VITE_SERVER_BASEURL__WEIXIN_TRIAL || baseUrl;
        break;
      case 'release':
        baseUrl = import.meta.env.VITE_SERVER_BASEURL__WEIXIN_RELEASE || baseUrl;
        break;
    }
  }

  return baseUrl;
};
